/**
 * 统一的状态指示器组件
 * 用于展示页面不同状态：加载中、错误、空数据、无网络等
 */

const mobx = require('../../../framework/mobx/mobx_wx.js');
const { uiStore } = require('../../../store/global/ui.js');
const { errorHandler } = require('../../../store/global/error_handler.js');

Component({
  /**
   * 使用MobX绑定行为
   */
  behaviors: [mobx.storeBindingsBehavior],
  
  /**
   * 配置MobX绑定
   */
  storeBindings: {
    store: uiStore,
    fields: {
      globalLoading: 'isLoading',
      globalError: (store) => store.errors.global,
      moduleErrors: (store) => store.errors.modules
    },
    actions: {
      clearError: 'clearError'
    }
  },
  
  /**
   * 组件选项
   */
  options: {
    addGlobalClass: true,
    styleIsolation: 'shared'
  },
  
  /**
   * 组件属性
   */
  properties: {
    // 状态类型
    type: {
      type: String,
      value: '' // 空值时自动判断，可选值：loading, error, empty, network, custom
    },
    
    // 模块名称
    module: {
      type: String,
      value: ''
    },
    
    // 自定义提示文本
    text: {
      type: String,
      value: ''
    },
    
    // 自定义图标
    icon: {
      type: String,
      value: ''
    },
    
    // 是否显示重试按钮
    showRetry: {
      type: Boolean,
      value: true
    },
    
    // 重试按钮文本
    retryText: {
      type: String,
      value: '重试'
    },
    
    // 自定义空状态图
    emptyImage: {
      type: String,
      value: ''
    },
    
    // 自定义错误图
    errorImage: {
      type: String,
      value: ''
    },
    
    // 自定义网络错误图
    networkImage: {
      type: String,
      value: ''
    }
  },
  
  /**
   * 组件内部数据
   */
  data: {
    // 当前显示状态
    currentType: '',
    
    // 显示文本
    currentText: '',
    
    // 是否显示组件
    show: false
  },
  
  /**
   * 数据监听器
   */
  observers: {
    // 监听类型和模块错误变化
    'type, module, globalLoading, globalError, moduleErrors': function(type, module, globalLoading, globalError, moduleErrors) {
      this._updateStatus(type, module, globalLoading, globalError, moduleErrors);
    }
  },
  
  /**
   * 组件生命周期
   */
  lifetimes: {
    /**
     * 组件实例进入页面节点树时执行
     */
    attached: function() {
      // 初始化状态
      this._updateStatus(
        this.properties.type,
        this.properties.module,
        this.data.globalLoading,
        this.data.globalError,
        this.data.moduleErrors
      );
    }
  },
  
  /**
   * 组件方法
   */
  methods: {
    /**
     * 更新状态显示
     * @private
     */
    _updateStatus: function(type, module, globalLoading, globalError, moduleErrors) {
      // 指定了具体类型时直接使用
      if (type) {
        this.setData({
          show: true,
          currentType: type,
          currentText: this.properties.text || this._getDefaultText(type)
        });
        return;
      }
      
      // 否则根据状态自动判断
      let autoType = '';
      let autoText = '';
      
      // 模块特定错误
      if (module && moduleErrors && moduleErrors[module]) {
        autoType = 'error';
        autoText = moduleErrors[module].message || '加载失败';
      }
      // 全局错误
      else if (globalError) {
        autoType = 'error';
        autoText = globalError.message || '加载失败';
      }
      // 全局加载状态
      else if (globalLoading) {
        autoType = 'loading';
        autoText = '加载中...';
      }
      // 默认不显示
      else {
        this.setData({ show: false });
        return;
      }
      
      this.setData({
        show: true,
        currentType: autoType,
        currentText: this.properties.text || autoText
      });
    },
    
    /**
     * 获取默认文本
     * @private
     */
    _getDefaultText: function(type) {
      switch (type) {
        case 'loading':
          return '加载中...';
        case 'error':
          return '加载失败，请稍后重试';
        case 'empty':
          return '暂无数据';
        case 'network':
          return '网络连接失败，请检查网络设置';
        default:
          return '';
      }
    },
    
    /**
     * 重试按钮点击事件
     */
    handleRetry: function() {
      // 清除错误
      if (this.properties.module) {
        this.clearError(this.properties.module);
      } else {
        this.clearError();
      }
      
      // 触发重试事件
      this.triggerEvent('retry');
    }
  }
}); 